"""
1.数据来源分析
    1.确认需求
        百度热榜（排名，标题，详情描述，图片）
    2，找url 发送请求
        确认静态（在源代码中）还是动态（ajax中） ajax是异步的，视频不是一下子加载出来的
        静态数据，查找源代码



        CTRL +u 查看网页源代码,ctrl +f 检索
        <!-- -->
        url 构成 协议://主机ip:端口号/路径？请求参数
        url ="https://top.baidu.com/board?tab=realtime"
2.爬虫代码实现
    1.发送请求
    2.获取数据
    3.解析数据
    4，保存数据
"""

# 爬虫通用框架
import requests
import re
import json


# 发送请求，获取数据
def get_html(url, headers):
    try:
        # 请求的方法使用常规里面的request的对应方法
        resp = requests.get(url=url, headers=headers)  # 发送get请求
        resp.raise_for_status()  # 抛出异常
        resp.encoding = 'utf-8'  # 根据网页查看到的内容来写
        # 返回请求的数据(resp.text 获取响应中的文本  。json获取类型数据  ，content 获取响应中的二进制数据)
        return resp.text

    except:
        return None


# def get_html(url, headers):
#     # 发送GET请求
#     resp = requests.get(url=url, headers=headers)
#
#     # 得到响应，用text属性获取html源代码
#     return resp.text


def parse_html(html):
    # 返回结果的列表
    res = []

    json_str = re.findall(r'<!--s-data:(.*?)-->', html, re.S)[0]
    """
        json.load()
        功能：将一个看上去是json的字符串变成json字典（python的字典）
        参数：string
        返回值：dict
    """
    # 将json字符转化成字典
    json_dict = json.loads(json_str)
    data = json_dict['data']
    cards = data['cards'][0]

    content = cards['content']
    print(len(content))
    # 字典的取值，1，按键值对取值，2，循环取值
    for item in content:
        index = item['index']  # 排名
        word = item['word']  # 标题
        desc = item["desc"]  # 描述
        img = item["img"]  # 图片

        dic = {
            'index': index,
            'word': word,
            'desc': desc,
            "img": img
        }
        res.append(dic)
    return res


"""
json是什么 js对象标记，是一种轻量级的数据交换格式
json格式：1.引号必须是双引号，2.只有花括号{}对象和中括号[]列表，3.以键值对保存数据

"""


def save_data(data):
    # txt保存
    with open('./top_list.txt', 'a+') as f:
        for item in data:
            index = item['index']
            word = item['word']
            desc = item["desc"]
            img = item["img"]
            f.write(str(index)+word+desc+img)

# w,r a(w,可以写一次，会覆盖，a可以连续写 +可读可写，r只读)

def main():
    url = 'https://top.baidu.com/board?tab=realtime'
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.68',
        # referer
        # cooker
    }

    html = get_html(url, headers)
    parse = parse_html(html)
    print(parse)
    save_data(parse)


if __name__ == "__main__":
    main()
